﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Sound;

namespace GameVLTK
{
    public static class Global
    {
        public static string PATH_TO_GAMESTATE_MAINMENU = "Images/GameStateMainMenu/";
        public static string PATH_TO_DATA = "Content/Data/";
        public static string PATH_IMAGES = "Images/";
        public static string PATH_SOUNDS = "Sounds/";
        public static string PATH_FOREGROUND = "Images/ForeGround/";
        public static string PATH_MOUSES = "Images/Mouses/";

        /// <summary>
        /// Kích thước màn hình
        /// </summary>
        public static int SCREEN_WIDTH = 806;
        public static int SCREEN_HEIGHT = 627;

        /// <summary>
        /// Kích thước của Map
        /// </summary>
        public static int MAP_WIDTH = 2560;
        public static int MAP_HEIGHT = 2560;
        /// <summary>
        /// Lưu thông tin về trạng thái của nhân vật
        /// </summary>
        public enum enmStates
        {
            DUNG_YEN,
            DI_BO,
            TAN_CONG,
            CHET
        };

        /// <summary>
        /// Các hướng di chuyển có thể của nhân vật
        /// </summary>
        public enum enmDirs
        {
            DOWN,
            DOWN_LEFT,
            LEFT,
            LEFT_UP,
            UP,
            UP_RIGHT,
            RIGHT,
            RIGHT_DOWN
        };

     
        /// <summary>
        /// Thông tin liên quan đến Character
        /// </summary>
        public static Vector2 CHARACTER_MOVING_SPEED= new Vector2(150, 150);
        public static int NUM_OF_DIRECTIONS= 8;
        
        /// <summary>
        /// Khoảng cách tối thiểu mà Player cách các biên của Map
        /// </summary>
        public static int DISTANCE= 300;

        /// <summary>
        /// Kích thước của Cell trong Map
        /// </summary>
        public static int CELL_WIDTH= 32;
        public static int CELL_HEIGH= 32;

        /// <summary>
        /// Vị trí thực của Map
        /// </summary>
        public static Vector2 TopLeft;

        /// <summary>
        /// Danh sách các event có thể có trong Game
        /// </summary>
        public enum EVENTS
        {
            //Sự kiện liên quan đến màn hình Main Menu
            GM_GAMESCREEN_MAINMEN_BUTTON_CLICKED,

            //Sự kiện do Killer phát sinh
            GM_KILLER_CLICKED,
            GM_Killer_COLLISION_SKILL,
            GM_KILLER_DIED,
            GM_KILLER_FIRED_SKILL,

            //Sự kiện cho Production phát ra
            GM_PRODUCTION_CLICKED,

            //Sự kiện do NPC phát ra
            GM_NPC_CLICKED,

            //Sự kiện do Player phát ra
            GM_PLAYER_ATTACK_KILLER,
            GM_PLAYER_FIRED_SKILL,

            //Sự kiện liên quan đến Map
            GM_MAP_TOPLEFT_CHANGED,
           

        };

        public static List<GameEntity> gameEntities = new List<GameEntity>();

        public static void BroadCastEvents(Global.EVENTS eventID, object sender, object[] args,
                                              GameEntity[] receivers)
        {
            if (receivers == null)
            {
                for (int i = 0; i < gameEntities.Count; i++)
                    if (gameEntities[i].OnEvent(eventID, sender, args) > 0)
                        break;
            }
            else
            {
                for (int i = 0; i < receivers.Length; i++)
                    if (receivers[i].OnEvent(eventID, sender, args) > 0)
                        break;
            }
        }

        public static Random rnd = new Random();


        /// <summary>
        /// 
        /// </summary>
        public static bool IsCollisioned(VisibleGameEntity v1, VisibleGameEntity v2)
        {
            bool kq = false;
            Rectangle recPlayer = new Rectangle((int)v1.TopLeft.X, (int)v1.TopLeft.Y,
                                              (int)v1.Size.X, (int)v1.Size.Y);

            Rectangle recKiller = new Rectangle((int)v2.TopLeft.X, (int)v2.TopLeft.Y,
                                           (int)v2.Size.X, (int)v2.Size.Y);

            if (recPlayer.Intersects(recKiller))
                kq = true;

            return kq;
        }


        public static SoundManager soundManager;

        /// <summary>
        /// Hiển thị text canh giữa theo tọa độ
        /// </summary>
        public static void DrawName(SpriteBatch spriteBatch, string name,
            Vector2 topLeft, Vector2 size,  Color color)
        {
            Vector2 stringSize = Map.font.MeasureString(name);
            spriteBatch.DrawString(Map.font, name,
                 new Vector2(topLeft.X + size.X / 2, topLeft.Y)
                 - new Vector2(stringSize.X / 2, 50), color);
        }
    }
}
